import java.util.ArrayList;
import java.util.Random;

import antlr.collections.List;

import model.Match;
import model.Team;
import model.Tournament;

public class fixture {

	public static String[][][] GeneraFixture(String[] equipos, Tournament tournament){
		
	
		int nroEquipos = equipos.length-1;
		int fechas = nroEquipos - 1;
		int partidosXfecha = nroEquipos / 2 ;
		int nroPartidos = (int) (Factorial(nroEquipos)/(Factorial(nroEquipos-2)*2));
		
		String[] desord = new String[nroEquipos+1];
		String[] testigo = new String[nroEquipos+1];
		String[][] partidos = new String[nroPartidos+1][3];
		int[] usados = new int[nroPartidos+1];             
		String[][][] cuadro = new String[partidosXfecha+1][fechas+1][3];
		
		cuadro[0][0][0]="00";
		
		if ((nroEquipos % 2)== 1) {
			cuadro[0][0][0]="01";
			return cuadro;
		}
		
		int i,j,k;
		String aux;
		int usado,arranque;
		int Nequi1 =0;
		int Nequi2=0;
		String equi2;
		
		// Copia la lista de equipos y la desordena
		for (i=1;i<=nroEquipos;i++) {
			desord[i]=equipos[i];
			
		}
		Random azar = new Random();
		for (i=1;i<=nroEquipos;i++) { 
			j = azar.nextInt(nroEquipos)+1;
			aux = desord[j];
			desord[j]=desord[i];
			desord[i]=aux;
		}
		
		// arma una lista con todos los partidos posibles
		k=0;
		for (i=1;i<=nroEquipos;i++) {
			for (j=i+1;j<=nroEquipos;j++) {
				k++;
				partidos[k][1]=desord[i];
				partidos[k][2]=desord[j];
				usados[k]=0;
			}
		}
		
		// los empieza a asignar fecha x fecha, partido por partido
		usado=0;
		for (fechas=1;fechas <= nroEquipos-1;fechas++) {
			Match match = new Match();
			//arma testigo a cubrir todos los equipos en la fecha
			for (i=1;i<=nroEquipos;i++) {
				testigo[i]=equipos[i];
			}
			
			arranque=1;
			for (partidosXfecha=1;partidosXfecha <= nroEquipos/2;partidosXfecha++) {
				//agarro el primer equipo faltante
				for (i=1 ; i <= nroEquipos ; i++) {
					if (!testigo[i].equals("XX")) {
						Nequi1=i;
						break;
					}
							
				}
				// busco entre los partidos
	            // el primero no usados que involucre al equipo seleccionado
	            for (i=arranque; i <= nroPartidos; i++) {
	            	
	            	System.out.println("empiezaa");
	            	System.out.println(testigo[Nequi1]);
	            	System.out.println(partidos[i][1]);
	            	System.out.println(partidos[i][2]);
	            	System.out.println("-------");
	            	if (((partidos[i][1].equals(testigo[Nequi1])) ||
	            		 (partidos[i][2].equals(testigo[Nequi1]))) &&
	            		 (usados[i] == 0)) {
	              		
  		// encontre un partido y busco el indice del otro equipo
	            		if (partidos[i][1].equals(testigo[Nequi1]))
	            			equi2=partidos[i][2];
	            		else
	            			equi2=partidos[i][1];
	            		for (Nequi2=1;Nequi2 <= nroEquipos ; Nequi2++){
	            			if (equi2.equals(testigo[Nequi2]))
	            				break;
	            		}
	            		if (Nequi2 <= nroEquipos) {
	            			cuadro[partidosXfecha][fechas][1]=partidos[i][1];
	            			cuadro[partidosXfecha][fechas][2]=partidos[i][2];
	            			testigo[Nequi1]="XX";
	            			testigo[Nequi2]="XX";
	            			usado++;
	            			usados[i]=usado;
	            			break;
	            		}
	            	}
	            }
	            if (i > nroPartidos) {
	            	// si no encontre partido tengo que volver al partido anterior y elegir otro
	                // desmarco el partido y establezco como nuevo punto de arranque el partido siguiente
	            	for (i=1;i<=nroPartidos;i++) {
	            		if (usados[i]==usado) {
	            			usados[i]=0;
	            			arranque=i+1;
	            			break;
	            		}
	            	}
	            	//  restablesco los equipos en el testigo
	            	for (j=1;j<=nroEquipos;j++) {
	            		if (equipos[j].equals(partidos[i][1])) {
	            			testigo[j]=partidos[i][1];
	            			break;
	            		}
	            	}
	            	for (j=1;j<=nroEquipos;j++) {
	            		if (equipos[j].equals(partidos[i][2])) {
	            			testigo[j]=partidos[i][2];
	            			break;
	            		}
	            	}
	            	usado--;
	            	// blanqueo el partido en la grilla y vuelvo un partido para atras
	            	cuadro[partidosXfecha-1][fechas][1]="";
	            	cuadro[partidosXfecha-1][fechas][2]="";
	            	partidosXfecha--;
	            	partidosXfecha--;
	            	if (partidosXfecha < 1) {
	            		cuadro[0][0][0]="99";
	            		break;
	            	}
	            }	
	            else
	            	arranque=1;
			}
			if (cuadro[0][0][0].equals("99")) {
				break;
			}
		}
		return cuadro;
	}
	
	private static long Factorial(int x)	{
	    if ( x <= 1 )     // base case
            return 1;
        else
            return x * Factorial( x - 1 );
	}

	
}